package com.goodfox.web.generic.provide.util;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

import org.apache.log4j.Logger;

/**
 * XML工具类，主要用于服务端手机接口的XML协议数据处理，解析工具使用JDK内置的XML类库
 * 
 * @author sunyu
 * @version 2011-06-07
 * 
 */

public class XmlUtil {
	
	//TODO sunyu 计划将所有XML解析相关，使用JDK javax.xml包实现的功能都封装为本类的静态方法

	//log4J logger
	private static Logger log = Logger.getLogger(XmlUtil.class);

	/**
	 * 
	 * 根据指定XML文档，获取文档根节信息
	 * 
	 * @param xml
	 *            XML输入流
	 * @return XML的根节点名称
	 */
	public static String getRootElementName(InputStream xml) {

		// 建立一个解析器工厂
		DocumentBuilderFactory domFactory = DocumentBuilderFactory
				.newInstance();
		// XML解析对象
		DocumentBuilder dombuilder = null;
		// XML文档对象
		Document document = null;
		try {
			// 使用解析工厂中建立XML解析对象，可能抛出ParserConfigurationException异常
			dombuilder = domFactory.newDocumentBuilder();
			// 使用解析器解析XML对象，可能抛出SAXException，IOException异常
			document = dombuilder.parse(xml);
		} catch (ParserConfigurationException e) {
			log.error("DocumentBuilderFactory建立DocumentBuilder失败：", e);
		} catch (SAXException e) {
			log.error("XML解析失败：", e);
		} catch (IOException e) {
			log.error("XML解析工程发生I/O异常：", e);
		}
		// 从XML文档中取得根节点
		Element root = document.getDocumentElement();
		// 返回根节点名称
		return root.getNodeName();

	}

	/**
	 * 
	 * 根据指定XML文档，获取文档根节信息
	 * 
	 * @param xml
	 *            XML字符串
	 * @return XML的根节点名称
	 * 
	 */
	public static String getRootElementName(String xml) {
		// 将XML String 转为字节数组
		byte[] bytes = xml.getBytes();
		// 字节数组转化为ByteArrayInputStream(InputStream的子类)
		ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
		// 调用Overwrite的方法
		return getRootElementName(bais);

	}

}
